package com.janko.springbootbase.controller.delay;

import io.netty.util.HashedWheelTimer;
import io.netty.util.Timer;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.TimeUnit;

/**
 * @Description 延时队列的几种实现方法
 * @Author nieyankang
 * @Version 1.0
 * @date 2020年10月9日15:14:44
 */
public class Delay {
    /**
     * 具体思路如下：
     * 1、DB-SQL轮训    使用quartz去定时查询DB库
     * 2、JDK的延迟队列
     * 3、netty时间轮算法
     * 4、redis缓存
     * 5、使用消息队列
     */
    public static void main(String[] args) {
//        orderdelay_jdkTest();
//        netty_delay();
        Delay_RedisTest();
    }

    //<editor-fold desc="redis实现的延迟队列">
    /**
     * redis实现的延迟队列
     */
    private static void Delay_RedisTest() {
        Delay_Redis delay_redis =new Delay_Redis();
        delay_redis.productionDelayMessage();
        delay_redis.consumerDelayMessage();
    }
    //</editor-fold>

    //<editor-fold desc="netty的方式实现延迟队列">
    /**
     * netty的方式实现延迟队列
     */
    private static void netty_delay() {
        Delay_Netty delay_netty=new Delay_Netty(true);
        Timer timer=new HashedWheelTimer();
        timer.newTimeout(delay_netty,5, TimeUnit.SECONDS);
        int i=1;
        while (delay_netty.flag){
            try{
                Thread.sleep(1000);
            }catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(i+"秒过去了.......");
            i++;
        }
    }
    //</editor-fold>

    //<editor-fold desc="JDK的延迟队列">
    /**
     * delay-jdk方式的实现延时队列
     */
    private static void orderdelay_jdkTest() {
        List<String> lstOrder = new ArrayList<String>() {{
            add("order001");
            add("order002");
            add("order003");
            add("order004");
            add("order005");
        }};
        DelayQueue<DelayOrder_JDK> queue=new DelayQueue<DelayOrder_JDK>();
        long start=System.currentTimeMillis();
        for (int i = 0; i < 5; i++) {
            //延迟3秒取出
            queue.put(new DelayOrder_JDK(lstOrder.get(i),3));
            try {
                queue.take().print();
                System.out.println("After " + (System.currentTimeMillis() - start) + " MilliSeconds");
            } catch (InterruptedException exception) {
                exception.printStackTrace();
            }
        }
    }
    //</editor-fold>
}
